package com.wusiwei.service;

import com.wusiwei.entity.Order;
import com.wusiwei.entity.OrderItem;
import com.wusiwei.vo.OrderStatistics;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 订单服务接口
 */
public interface OrderService {

    /**
     * 获取所有订单
     *
     * @return 订单列表
     */
    List<Order> getAllOrders();

    /**
     * 根据ID获取订单
     *
     * @param id 订单ID
     * @return 订单信息
     */
    Order getOrderById(Long id);

//    /**
//     * 查询订单列表
//     *
//     * @param queryDTO 查询条件
//     * @return 订单列表
//     */
//    List<Order> getOrderList(OrderQueryDTO queryDTO);

    /**
     * 创建订单
     *
     * @param order 订单信息
     * @return 创建结果
     */
    boolean createOrder(Order order);

    /**
     * 更新订单
     *
     * @param id    订单ID
     * @param order 订单信息
     * @return 更新结果
     */
    boolean updateOrder(Long id, Order order);

    /**
     * 删除订单
     *
     * @param id 订单ID
     * @return 删除结果
     */
    boolean deleteOrder(Long id);

    /**
     * 批量删除订单
     *
     * @param ids 订单ID列表
     * @return 删除结果
     */
    boolean batchDeleteOrders(List<Long> ids);

    /**
     * 分页查询订单
     *
     * @param pageNum      页码
     * @param pageSize     每页大小
     * @param orderNumber  订单号
     * @param supplierName 供应商名称
     * @param status       订单状态
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return 分页结果
     */
    Object getOrderPage(int pageNum, int pageSize, String orderNumber, String supplierName, String status, String startDate, String endDate);

    /**
     * 获取订单状态统计
     *
     * @return 订单状态统计
     */
    OrderStatistics getOrderStatusStatistics();

    /**
     * 导出订单
     *
     * @param orderNumber  订单号
     * @param supplierName 供应商名称
     * @param status       状态
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return 导出的文件数据
     */
    byte[] exportOrders(String orderNumber, String supplierName,
                        String status, String startDate, String endDate);

//    /**
//     * 获取订单总金额
//     *
//     * @return 订单总金额
//     */
//    BigDecimal getTotalOrderAmount();

    /**
     * 按状态统计订单
     *
     * @return 订单状态统计
     */
    List<Map<String, Object>> countByStatus();

    /**
     * 按供应商统计订单
     *
     * @return 供应商统计
     */
    List<Map<String, Object>> countBySupplier();

    /**
     * 获取订单总金额统计
     *
     * @return 金额统计信息
     */
    Map<String, Object> getTotalAmountStats();

//    /**
//     * 获取订单趋势
//     *
//     * @return 订单趋势数据
//     */
//    List<Map<String, Object>> getOrderTrend();

    /**
     * 统计订单总数
     *
     * @return 订单总数
     */
    int countTotal();

    /**
     * 获取订单总金额
     *
     * @return 订单总金额
     */
    BigDecimal getTotalAmount();

    /**
     * 获取当月订单数量
     *
     * @return 当月订单数量
     */
    int getCurrentMonthOrderCount();

    /**
     * 获取月度订单趋势
     *
     * @param year 年份
     * @return 月度趋势数据
     */
    List<Map<String, Object>> getMonthlyOrderTrend(Integer year);

    /**
     * 根据供应商和金额范围查询订单
     *
     * @param supplierName 供应商名称
     * @param targetAmount 目标金额
     * @param minAmount    最小金额
     * @param maxAmount    最大金额
     * @return 符合条件的订单列表
     */
    List<Order> findBySupplierAndAmount(String supplierName, BigDecimal targetAmount,
                                        BigDecimal minAmount, BigDecimal maxAmount);

//    /**
//     * 获取月度订单金额统计
//     *
//     * @return 月度订单金额统计列表
//     */
//    List<OrderStatistics.MonthlyAmount> getMonthlyOrderAmounts();
//
//    /**
//     * 获取订单状态统计
//     *
//     * @return 订单状态统计
//     */
//    Map<String, Integer> getStatusCount();

    /**
     * 根据近似供应商名称和金额范围查询订单
     * 使用模糊匹配查询供应商名称相似的订单
     *
     * @param supplierName 供应商名称
     * @param targetAmount 目标金额
     * @param minAmount    最小金额
     * @param maxAmount    最大金额
     * @return 符合条件的订单列表
     */
    List<Order> findBySimilarSupplierAndAmount(String supplierName, BigDecimal targetAmount,
                                               BigDecimal minAmount, BigDecimal maxAmount);

    /**
     * 根据ID查找订单
     *
     * @param id 订单ID
     * @return 订单信息
     */
    Order findById(Long id);

    /**
     * 获取订单关联单据
     *
     * @param orderId 订单ID
     * @return 关联单据信息
     */
    Object getOrderRelatedDocuments(Long orderId);

    /**
     * 统计指定年份的订单数量
     *
     * @param year 年份
     * @return 订单数量
     */
    int countOrdersByYear(Integer year);

    /**
     * 根据订单号查询订单
     *
     * @param orderNumber 订单号
     * @return 订单信息
     */
    Order findByOrderNumber(String orderNumber);

    /**
     * 获取订单明细项
     *
     * @param orderId 订单ID
     * @return 订单明细项列表
     */
    List<OrderItem> getOrderItems(Long orderId);
} 